package pruebas;

import junit.framework.TestCase;
import java.util.ArrayList;

import juego.Avioneta;
import juego.AvionCivil;
import juego.Botin;
import juego.Explorador;
import juego.Bombardero;
import juego.Coordenada;
import juego.Coordinador;
import juego.ExcepcionMuerto;
import juego.Helicoptero;
import juego.FormacionCazas;
import juego.Laser;
import juego.MejoraArmamento;
import juego.Movil;
import juego.Proyectil;
import juego.Torpedo;

public class TestCoordinador extends TestCase {
	
	public void testMurio(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		Coordinador coordinador = new Coordinador(listaDeMoviles);
		assertFalse(coordinador.murio());
		Coordenada ubicacionLaser = new Coordenada(10,13);
		Proyectil laser = new Laser(ubicacionLaser);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(new Bombardero(10,14));
		listaDeMoviles.add(new Torpedo(new Coordenada(10,16)));
		assertFalse(coordinador.murio());
		
		try {
			coordinador.jugar(0);
			assertTrue(true);
		} catch (ExcepcionMuerto e) {
			assertTrue(false);
		}
		
		assertTrue(coordinador.murio());
		try {
			coordinador.jugar(0);
			assertTrue(false);
		} catch (ExcepcionMuerto e) {
			assertTrue(true);
		}
	}
	
	public void testPuntajeAlcanzado(){
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		Coordinador coordinador = new Coordinador(listaDeMoviles);
		assertFalse(coordinador.puntajeAlcanzado());
	}

	public void testJugar(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		Avioneta avioneta1 = new Avioneta(15,-9);
		Avioneta avioneta2 = new Avioneta(-20,-16);
		Helicoptero helicoptero = new Helicoptero(0,0);
		Coordenada ubicacionLaser = new Coordenada(0,17);
		Proyectil laser = new Laser(ubicacionLaser);
		laser.hacerLeal();
		Bombardero bombardero1 = new Bombardero(-45,-6);
		Bombardero bombardero2 = new Bombardero(36,7);
		
		listaDeMoviles.add(avioneta1);
		listaDeMoviles.add(laser);
		listaDeMoviles.add(helicoptero);
		listaDeMoviles.add(avioneta2);
		listaDeMoviles.add(bombardero1);
		listaDeMoviles.add(bombardero2);
		assertEquals(6,listaDeMoviles.size());
		
		Coordinador coordinador = new Coordinador(listaDeMoviles);
		
		try{
			coordinador.jugar(50);
			assertTrue(true);
		}
		catch(ExcepcionMuerto excepcion){
			assertTrue(false);
		};
		assertTrue(coordinador.verPuntaje()==0);
		assertFalse(coordinador.murio());
		
		for (int i = 1; i<=5;i++){
			
			try{
				coordinador.jugar(50);
				}
				catch(ExcepcionMuerto excepcion){
					assertTrue(coordinador.murio());
				};
			
		};
		
		assertFalse(coordinador.murio());
		assertTrue(coordinador.verPuntaje()==0);
	};
	
	public void testJugarSinParametros(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		Coordenada coord1 = new Coordenada(-10,20);
		Bombardero unBombardero = new Bombardero(coord1);
		unaFlota.add(unBombardero);
		Coordinador coordinador = new Coordinador(unaFlota);
		Movil unAlgo42 = (unaFlota.get(0));
		for (int i = 1; i <=3; i++){
			try {
				coordinador.jugar();
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (false);
			}
		}
		
		//Algo42 deberia seguir en el mismo lugar
		Coordenada coord2 = unAlgo42.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (10));
		assertTrue(y2 == (0));
		
		Coordenada coord3 = unBombardero.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (5));
		assertTrue(y3 == (5));
		
		try {
			coordinador.jugar();
			assertTrue (true);
		}
		catch(ExcepcionMuerto e){
			assertTrue (false);
		}
		
		assertFalse(unAlgo42.estaVivo());
		assertFalse(unBombardero.estaVivo());
		
	};
	
	public void testFlota(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		Coordenada coord1 = new Coordenada(-10,80);
		Bombardero unBombardero = new Bombardero(coord1);
		unaFlota.add(unBombardero);
		Coordinador coordinador = new Coordinador(unaFlota);
		Movil unAlgo42 = (unaFlota.get(0));
		try {
			coordinador.jugar(0);
			assertTrue (true);
		}
		catch(ExcepcionMuerto e){
			assertTrue (false);
		}
		
		Coordenada coord2 = unAlgo42.verUbicacion();
		int x2 = coord2.obtenerCoordenadaX();
		int y2 = coord2.obtenerCoordenadaY();
		assertTrue(x2 == (10));
		assertTrue(y2 == (15));
		
		Coordenada coord3 = unBombardero.verUbicacion();
		int x3 = coord3.obtenerCoordenadaX();
		int y3 = coord3.obtenerCoordenadaY();
		assertTrue(x3 == (-5));
		assertTrue(y3 == (75));
		
		for (int i = 1; i <= 3; i++){
			try {
				coordinador.jugar(0);
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (false);
			}
		}
		
		assertFalse(unAlgo42.estaVivo());
		assertFalse(unBombardero.estaVivo());
		assertTrue(coordinador.murio());
		assertFalse(coordinador.puntajeAlcanzado());
	}
	
	public void testFlota2(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		
		Coordenada coord1 = new Coordenada(5,85);
		Bombardero unBombardero1 = new Bombardero(coord1);
		Coordenada coord2 = new Coordenada(-15,85);
		Bombardero unBombardero2 = new Bombardero(coord2);
		unaFlota.add(unBombardero1);
		unaFlota.add(unBombardero2);
		Coordinador coordinador = new Coordinador(unaFlota);
		Movil unAlgo42 = (unaFlota.get(0));
		
		for (int i = 1; i <= 4; i++){
			try {
				coordinador.jugar(0);
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (false);
			}
		}

	}	
	
	public void testFlota3(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		FormacionCazas unaFormDeCazas = new FormacionCazas(50,50,unaFlota);
	
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(-10,50);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
	
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(10,50);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
	
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(-5,50);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
	
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(5,50);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
	
		Coordinador coordinador = new Coordinador(unaFlota);
		Movil unAlgo42 = (unaFlota.get(0));
		
		for (int i = 1; i <= 6; i++){
			try {
				coordinador.jugar((Math.PI)/2);
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (true);
			}
			try {
				coordinador.jugar(3*((Math.PI)/2));
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (true);
			}
		} 
		//
		
		assertFalse(unAlgo42.estaVivo());
		assertTrue(coordinador.murio());
	}
	
	public void testFlota4(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		FormacionCazas unaFormDeCazas = new FormacionCazas(50,50,unaFlota);
		
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(-10,40);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
		
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(10,40);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
		
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(-5,40);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
		
		for (int i = 1; i <= 5; i++){
			Coordenada coord1 = new Coordenada(5,40);
			Explorador unExplorador = new Explorador(coord1);
			unaFlota.add(unExplorador);
		}
		
		assertEquals(25,unaFlota.size());
		Coordinador coordinador = new Coordinador(unaFlota);
		assertEquals(26,unaFlota.size());
		Movil unAlgo42 = (unaFlota.get(0));
		
		for (int i = 1; i <= 4; i++){
			try {
				coordinador.jugar((Math.PI)/2);
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (false);
			}
			try {
				coordinador.jugar(3*((Math.PI)/2));
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (true);
			}
		}
		
		assertFalse(unaFlota.contains(unAlgo42));
		assertFalse(coordinador.puntajeAlcanzado());
		assertTrue(coordinador.murio());
		assertFalse(unAlgo42.estaVivo());
	
	}	
	


	public void testFlota5(){
		ArrayList<Movil> unaFlota = new ArrayList<Movil>();
		FormacionCazas unaFormDeCazas = new FormacionCazas(50,50,unaFlota);
		
		Coordenada coord1 = new Coordenada(5,40);
		Explorador unExplorador = new Explorador(coord1);
		unaFlota.add(unExplorador);
		
		Coordenada coord2 = new Coordenada(0,50);
		Bombardero unBombardero = new Bombardero(coord2);
		unaFlota.add(unBombardero);
		
		Coordenada coord3 = new Coordenada(-20,60);
		Avioneta unaAvioneta = new Avioneta(coord3);
		unaFlota.add(unaAvioneta);
		
		AvionCivil unAvionCivil = new AvionCivil(-15,30);
		unaFlota.add(unAvionCivil);
		
		Helicoptero unHelicoptero = new Helicoptero(0,40);
		unaFlota.add(unHelicoptero);
		
		assertEquals(10,unaFlota.size());
		
		Coordinador unCoordinador = new Coordinador(unaFlota);
		Movil unAlgo42 = (unaFlota.get(0));
		
		for (int i = 1; i <= 4; i++){
			try {
				unCoordinador.jugar((Math.PI)/2);
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (false);
			}
			try {
				unCoordinador.jugar(3*((Math.PI)/2));
				assertTrue (true);
			}
			catch(ExcepcionMuerto e){
				assertTrue (true);
			}
		}
		
		assertFalse(unCoordinador.puntajeAlcanzado());
		assertFalse(unAlgo42.estaVivo());
		assertTrue(unCoordinador.murio());
	}
	
	public void testDisparar(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		Coordinador coordinador = new Coordinador(listaDeMoviles);
		assertEquals(1,listaDeMoviles.size());
		
		//dispara el laser
		try{
			coordinador.disparar();
			assertTrue(true);
		}
		catch (ExcepcionMuerto e){
			assertTrue(false);
		}
		
		assertEquals(2, listaDeMoviles.size());
		
	}
	
}


